﻿/*
-----------------------------------------------------------------------------
This source file is part of Cell Cloud.

Copyright (c) 2009-2012 Cell Cloud Team - cellcloudproject@gmail.com

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-----------------------------------------------------------------------------
*/

#ifndef CellSingleFileResultSet_h
#define CellSingleFileResultSet_h

#include "CellPrerequisites.h"
#include "CellResultSet.h"

namespace cell
{
/** 单一文件存储器结果集。
@note
	非线程安全对象。
@author
	Jiangwei Xu
*/
class _CellExport SingleFileResultSet : public ResultSet, public StorageAlloc
{
public:
	/**
	*/
	SingleFileResultSet(void);

	/**
	*/
	virtual ~SingleFileResultSet(void);

public:
	/**
	*/
	bool absolute(int cursor);

	/**
	*/
	bool relative(int cursor);

	/** 游标移动到数据头。
	*/
	bool first(void);

	/** 游标移动到数据尾。
	*/
	bool last(void);

	/** 游标下移一个数据位。
	*/
	bool next(void);

	/** 游标上移一个数据位。
	*/
	bool previous(void);

	/**
	*/
	bool isFirst(void);

	/**
	*/
	bool isLast(void);

	/** 返回指定游标处字符型数据。
	*/
	char getChar(int index);

	/** 返回指定游标标签处字符型数据。
	*/
	char getChar(const String& label);

	/** 返回指定游标处整数型数据。
	*/
	int getInt(int index);

	/** 返回指定游标标签处整数型数据。
	*/
	int getInt(const String& label);

	/** 返回指定游标处长整数型数据。
	*/
	long getLong(int index);

	/** 返回指定游标标签处长整数型数据。
	*/
	long getLong(const String& label);

	/** 返回指定游标处64bit整数型数据。
	*/
	int64 getInt64(int index);

	/** 返回指定游标标签处64bit整数型数据。
	*/
	int64 getInt64(const String& label);

	/** 返回指定游标处字符串型数据。
	*/
	String getString(int index);

	/** 返回指定游标标签处字符串型数据。
	*/
	String getString(const String& label);

	/** 返回指定游标处布尔型数据。
	*/
	bool getBool(int index);

	/** 返回指定游标标签处布尔型数据。
	*/
	bool getBool(const String& label);

	/** 返回整个数据区数据。
	@return 返回数据长度。
	*/
	int getRaw(const String& label, char* dst, int offset, int length);

	/** 获取原始数据。
	@return 返回数据长度。
	*/
	int64 getRaw(const String& label, char* dst, int64 offset, int64 length);

	/**
	*/
	void updateChar(int index, char value);

	/**
	*/
	void updateChar(const String& label, char value);

	/**
	*/
	void updateInt(int index, int value);

	/**
	*/
	void updateInt(const String& label, int value);

	/**
	*/
	void updateLong(int index, long value);

	/**
	*/
	void updateLong(const String& label, long value);

	/**
	*/
	void updateInt64(int index, int64 value);

	/**
	*/
	void updateInt64(const String& label, int64 value);

	/**
	*/
	void updateString(int index, const String& value);

	/**
	*/
	void updateString(const String& label, const String& value);

	/**
	*/
	void updateBool(int index, bool value);

	/**
	*/
	void updateBool(const String& label, bool value);

	/**
	*/
	void updateRaw(const String& label, char* src, int offset, int length);

	/**
	*/
	void updateRaw(const String& label, char* src, int64 offset, int64 length);

private:
	/**
	*/
	void fill(SingleFileStorage* storage, const String& statement, const String& fileName, int64 fileSize);

	/**
	*/
	void copyFileData(CharBuffer* src, size_t srcOffset, size_t srcLength);

private:
	int mCursor;

	SingleFileStorage* mStorage;
	String mStatement;
	String mFileName;
	int64 mFileSize;

	uint mBufOffset;	/// 缓存相对文件数据的偏移位置
	uint mBufLength;	/// 缓存长度
	CharBuffer* mBufData;

	friend class SingleFileStorage;
};
} // end namespace cell

#endif // CellSingleFileResultSet_h
